/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：呼叫中心-系统通用工具封装层
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taiping.cc.application.tools;

import lombok.experimental.UtilityClass;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * Stream工具类
 */
@UtilityClass
public final class StreamUtils {

    /**
     * 二维数组转换为一维集合
     */
    public static <T extends Object & Serializable> List<T> convertToArray(T[][] arrayOfArray) {
        return Stream.of(arrayOfArray)
                .flatMap(Stream::of)
                .collect(Collectors.toList());
    }

    /**
     * 二维集合转换为一维集合
     */
    public static <T extends Object & Serializable> List<T> convertToList(List<List<T>> listOfList) {
        /* 使用场景：
         * 将 List<List<T>> 转换为 List<T> ，高端操作就是这么秀！啥？你别用 Arrays.asList(T... a) 啊，也别用for循环啊，试试吧，找找看还有没有别的好玩的API，宝贝儿。
         * List<HttpParamConfigDO> httpParamConfigList = ImmutableList.of(queryParamConfigList,
         *         headerParamConfigList, formParamConfigList, jsonParamConfigList, mappingParamConfigList)
         *        .parallelStream()
         *        .flatMap(Collection::stream)
         *        .collect(Collectors.toList());
         */
        return listOfList.parallelStream()
                .flatMap(Collection::stream)
                .collect(Collectors.toList());
    }

    /**
     * 集合转Map对象
     */
    public static <T, K, U> Map<K, U> toMap(List<T> list, Function<T, K> keyMapper, Function<T, U> valueMapper) {
        return list.parallelStream()
                .collect(Collectors.toMap(keyMapper, valueMapper, (oldValue, newValue) -> newValue));
    }

    /**
     * 获取对象集合中指定字段值的集合
     */
    public static <T, R> List<R> toValueList(List<T> list, Function<T, R> valueMapper) {
        return list.parallelStream()
                .map(valueMapper)
                .distinct()
                .collect(Collectors.toList());
    }

}
